(in-package :TRAPS)
; Generated from #P"macintosh-hd:hd3:CInterface Translator:Source Interfaces:asm.h"
; at Sunday July 2,2006 7:26:39 pm.
; 
;  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
;  *
;  * @APPLE_LICENSE_HEADER_START@
;  * 
;  * The contents of this file constitute Original Code as defined in and
;  * are subject to the Apple Public Source License Version 1.1 (the
;  * "License").  You may not use this file except in compliance with the
;  * License.  Please obtain a copy of the License at
;  * http://www.apple.com/publicsource and read it before using this file.
;  * 
;  * This Original Code and all software distributed under the License are
;  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
;  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
;  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
;  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
;  * License for the specific language governing rights and limitations
;  * under the License.
;  * 
;  * @APPLE_LICENSE_HEADER_END@
;  
; 
;  * @OSF_COPYRIGHT@
;  
;  
;  * Mach Operating System
;  * Copyright (c) 1991,1990,1989 Carnegie Mellon University
;  * All Rights Reserved.
;  * 
;  * Permission to use, copy, modify and distribute this software and its
;  * documentation is hereby granted, provided that both the copyright
;  * notice and this permission notice appear in all copies of the
;  * software, derivative works or modified versions, and any portions
;  * thereof, and that both notices appear in supporting documentation.
;  * 
;  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
;  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
;  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
;  * 
;  * Carnegie Mellon requests users of this software to return to
;  * 
;  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
;  *  School of Computer Science
;  *  Carnegie Mellon University
;  *  Pittsburgh PA 15213-3890
;  * 
;  * any improvements or extensions that they make and grant Carnegie Mellon
;  * the rights to redistribute these changes.
;  
; #ifndef	_I386_ASM_H_
; #define	_I386_ASM_H_
; #ifdef _KERNEL
#| #|
#include <gprof.h>
#endif
|#
 |#
;  _KERNEL 
; #ifdef MACH_KERNEL
#| #|
#include <mach_kdb.h>
|#
 |#

; #else	/* !MACH_KERNEL */
(defconstant $MACH_KDB 0)
; #define	MACH_KDB 0

; #endif	/* !MACH_KERNEL */


; #if	defined(MACH_KERNEL) || defined(_KERNEL)
#| 
(require-interface "gprof")
 |#

; #endif	/* MACH_KERNEL || _KERNEL */

(defconstant $S_ARG0 4)
; #define S_ARG0	 4(%esp)
(defconstant $S_ARG1 8)
; #define S_ARG1	 8(%esp)
(defconstant $S_ARG2 12)
; #define S_ARG2	12(%esp)
(defconstant $S_ARG3 16)
; #define S_ARG3	16(%esp)
; #define FRAME	pushl %ebp; movl %esp, %ebp
; #define EMARF	leave
(defconstant $B_ARG0 8)
; #define B_ARG0	 8(%ebp)
(defconstant $B_ARG1 12)
; #define B_ARG1	12(%ebp)
(defconstant $B_ARG2 16)
; #define B_ARG2	16(%ebp)
(defconstant $B_ARG3 20)
; #define B_ARG3	20(%ebp)
;  There is another definition of ALIGN for .c sources 
; #ifdef ASSEMBLER
#| #|
#define ALIGN 2,0x90
#endif
|#
 |#
;  ASSEMBLER 
; #ifndef FALIGN
; #define FALIGN ALIGN

; #endif

; #define LB(x,n) n

; #if	__STDC__
#| ; #ifndef __NO_UNDERSCORES__
; #define	LCL(x)	L ## x
; #define EXT(x) _ ## x
; #define LEXT(x) _ ## x ## :

; #else
; #define	LCL(x)	.L ## x
; #define EXT(x) x
; #define LEXT(x) x ## :

; #endif

; #define LBc(x,n) n ## :
; #define LBb(x,n) n ## b
; #define LBf(x,n) n ## f
 |#

; #else /* __STDC__ */
; #ifndef __NO_UNDERSCORES__
; #define LCL(x) L/**/x
; #define EXT(x) _/**/x
; #define LEXT(x) _/**/x/**/:
#| 
; #else /* __NO_UNDERSCORES__ */
; #define	LCL(x)	.L/**/x
; #define EXT(x) x
; #define LEXT(x) x/**/:
 |#

; #endif /* __NO_UNDERSCORES__ */

; #define LBc(x,n) n/**/:
; #define LBb(x,n) n/**/b
; #define LBf(x,n) n/**/f

; #endif /* __STDC__ */

; #define SVC .byte 0x9a; .long 0; .word 0x7
; #define RPC_SVC .byte 0x9a; .long 0; .word 0xf
; #define String	.asciz
; #define Value	.word
; #define Times(a,b) (a*b)
; #define Divide(a,b) (a/b)
; #define INB	inb	%dx, %al
; #define OUTB	outb	%al, %dx
; #define INL	inl	%dx, %eax
; #define OUTL	outl	%eax, %dx
; #define data16	.byte 0x66
; #define addr16	.byte 0x67

; #if !GPROF
; #define MCOUNT
#| 
; #elif defined(__SHARED__)
; #define MCOUNT		; .data;			.align ALIGN;			LBc(x, 8) .long 0;			.text;			Gpush;			Gload;			leal Gotoff(LBb(x,8)),%edx;			Egaddr(%eax,_mcount_ptr);			Gpop;			call *(%eax);
 |#

; #else	/* !GPROF, !__SHARED__ */
; #define MCOUNT		; .data;			.align ALIGN;			LBc(x, 8) .long 0;			.text;			movl LBb(x,8),%edx;			call *EXT(_mcount_ptr);

; #endif /* GPROF */

; #ifdef __ELF__
#| #|
#define ELF_FUNC(x)	.type x,@function
#define ELF_DATA(x)	.type x,@object
#define ELF_SIZE(x,s)	.size x,s
|#
 |#

; #else
; #define ELF_FUNC(x)
; #define ELF_DATA(x)
; #define ELF_SIZE(x,s)

; #endif

; #define	Entry(x)	.globl EXT(x); ELF_FUNC(EXT(x)); .align FALIGN; LEXT(x)
; #define	ENTRY(x)	Entry(x) MCOUNT
; #define	ENTRY2(x,y)	.globl EXT(x); .globl EXT(y); 			ELF_FUNC(EXT(x)); ELF_FUNC(EXT(y)); 			.align FALIGN; LEXT(x); LEXT(y) 			MCOUNT

; #if __STDC__
#| 
; #define	ASENTRY(x) 	.globl x; .align FALIGN; x ## : ELF_FUNC(x) MCOUNT
 |#

; #else
; #define	ASENTRY(x) 	.globl x; .align FALIGN; x: ELF_FUNC(x) MCOUNT

; #endif /* __STDC__ */

; #define	DATA(x)		.globl EXT(x); ELF_DATA(EXT(x)); .align ALIGN; LEXT(x)
; #define End(x)		ELF_SIZE(x,.-x)
; #define END(x)		End(EXT(x))
; #define ENDDATA(x)	END(x)
; #define Enddata(x)	End(x)
; 
;  * ELF shared library accessor macros.
;  * Gpush saves the %ebx register used for the GOT address
;  * Gpop pops %ebx if we need a GOT
;  * Gload loads %ebx with the GOT address if shared libraries are used
;  * Gcall calls an external function.
;  * Gotoff allows you to reference local labels.
;  * Gotoff2 allows you to reference local labels with an index reg.
;  * Gotoff3 allows you to reference local labels with an index reg & size.
;  * Gaddr loads up a register with an address of an external item.
;  * Gstack is the number of bytes that Gpush pushes on the stack.
;  *
;  * Varients of the above with E or L prefixes do EXT(name) or LCL(name)
;  * respectively.
;  
; #ifndef __SHARED__
; #define Gpush
; #define Gpop
; #define Gload
; #define Gcall(func)		call func
; #define Gotoff(lab)		lab
; #define Gotoff2(l,r)		l(r)
; #define Gotoff3(l,r,s)		l(,r,s)
; #define Gaddr(to,lab)		movl $lab,to
; #define Gcmp(lab,reg)		cmpl $lab,reg
; #define Gmemload(lab,reg)	movl lab,reg
; #define Gmemstore(reg,lab,tmp)	movl reg,lab
(defconstant $Gstack 0)
; #define Gstack			0
#| 
; #else
; #ifdef __ELF__			/* ELF shared libraries */
#|
#define Gpush			pushl %ebx
#define Gpop			popl %ebx
#define Gload			call 9f; 9: popl %ebx; addl $_GLOBAL_OFFSET_TABLE_+[.-9b],%ebx
#define Gcall(func)		call EXT(func)@PLT
#define Gotoff(lab)		lab@GOTOFF(%ebx)
#define Gotoff2(l,r)		l@GOTOFF(%ebx,r)
#define Gotoff3(l,r,s)		l@GOTOFF(%ebx,r,s)
#define Gaddr(to,lab)		movl lab@GOT(%ebx),to
#define Gcmp(lab,reg)		cmpl reg,lab@GOT(%ebx)
#define Gmemload(lab,reg)	movl lab@GOT(%ebx),reg; movl (reg),reg
#define Gmemstore(reg,lab,tmp)	movl lab@GOT(%ebx),tmp; movl reg,(tmp)
#define Gstack			4

|#

; #else				/* ROSE shared libraries */
; #define Gpush
; #define Gpop
; #define Gload
; #define Gcall(func)		call *9f; .data; .align ALIGN; 9: .long func; .text
; #define Gotoff(lab)		lab
; #define Gotoff2(l,r)		l(r)
; #define Gotoff3(l,r,s)		l(,r,s)
; #define Gaddr(to,lab)		movl 9f,to; .data; .align ALIGN; 9: .long lab; .text
; #define Gcmp(lab,reg)		cmpl reg,9f; .data; .align ALIGN; 9: .long lab; .text
; #define Gmemload(lab,reg)	movl 9f,reg; movl (reg),reg; .data; .align ALIGN; 9: .long lab; .text
; #define Gmemstore(reg,lab,tmp)	movl 9f,tmp; movl reg,(tmp); .data; .align ALIGN; 9: .long lab; .text
; #define Gstack			0

; #endif	/* __ELF__ */

 |#

; #endif	/* __SHARED__ */

;  Egotoff is not provided, since external symbols should not use @GOTOFF
;    relocations.  
; #define Egcall(func)		Gcall(EXT(func))
; #define Egaddr(to,lab)		Gaddr(to,EXT(lab))
; #define Egcmp(lab,reg)		Gcmp(EXT(lab),reg)
; #define Egmemload(lab,reg)	Gmemload(EXT(lab),reg)
; #define Egmemstore(reg,lab,tmp)	Gmemstore(reg,EXT(lab),tmp)
; #define Lgotoff(lab)		Gotoff(LCL(lab))
; #define Lgotoff2(l,r)		Gotoff2(LCL(l),r)
; #define Lgotoff3(l,r,s)		Gotoff3(LCL(l),r,s)
; #define Lgcmp(lab,reg)		Gcmp(LCL(lab),reg)
; #define Lgmemload(lab,reg)	movl Lgotoff(lab),reg
; #define Lgmemstore(reg,lab,tmp)	movl reg,Lgotoff(lab)
; #ifdef ASSEMBLER
#| #|
#ifMACH_KDB
#include <ddbstab.h>

#endif

|#
 |#

; #else /* NOT ASSEMBLER */
;  These defines are here for .c files that wish to reference global symbols
;  * within __asm__ statements. 
;  
; #ifndef __NO_UNDERSCORES__
(defconstant $CC_SYM_PREFIX "_")
; #define CC_SYM_PREFIX "_"
#| 
; #else
; #define CC_SYM_PREFIX ""
 |#

; #endif /* __NO_UNDERSCORES__ */


; #endif /* ASSEMBLER */


; #endif /* _I386_ASM_H_ */


(provide-interface "asm")